package ar.edu.utn.frba.disenio.model.tests;


import java.util.ArrayList;
import java.util.List;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import ar.edu.utn.frba.disenio.model.*;

import com.lanchita.excepciones.CodigoErroneoException;

public class TestAerolineas {
	
	UsuarioPagoMOCK usuarioVIP = new UsuarioPagoMOCK();
	UsuarioPagoMOCK usuarioNoVIP = new UsuarioPagoMOCK();
	UsuarioPagoMOCK usuario = new UsuarioPagoMOCK();
	UsuarioFreeMOCK usuarioFree = new UsuarioFreeMOCK();
	AerolineaMOCK aerolineaTest = new AerolineaMOCK();
	List<Asiento> listaConUnAsiento = new ArrayList<Asiento>();
	Asiento unAsiento = new Asiento("01202022220202-3", 200, "P", "V", aerolineaTest);
	Asiento unAsientoQueVale200000 = new Asiento("01202022220202-3", 200000, "P", "V", aerolineaTest);
	Asiento unAsientoQueVale99999 = new Asiento("01202022220202-3", 99999, "P", "V", aerolineaTest);
	
	@Before
	public void setUp(){
		usuarioVIP.registrarCompra(unAsientoQueVale200000);
		usuario.registrarCompra(unAsientoQueVale99999);
		listaConUnAsiento.add(unAsiento);
	}

	@Test
	public void usuarioPagoNoVIPBuscaAsientosYRecibeTodosLosAsientosMenosLasSuperOfertas(){
		/*Un Usuario que paga por el servicio y no es VIP realiza una busqueda. Como consecuencia debe recibir
		todos los Asientos menos aquellos que son SuperOfertas*/
		Assert.assertEquals(3, usuarioNoVIP.buscarAsiento("BSAS", "LA", "20121010", "20121011").size());
		}
	
	@Test
	public void usuarioRealizaBusquedasYGuardaLasBusquedasCorrectamente(){
		/*Un Usuario realiza dos busquedas, se verifica si las busquedas son guardadas en el usuario correctamente*/
		usuarioNoVIP.buscarAsiento("BSAS", "LA", "20121010", "20121011");
		usuarioNoVIP.buscarAsiento("BSAS", "LA", "20121010", "20121011");
		Assert.assertEquals(2, usuarioNoVIP.getBusquedas().size());
	}
	
	@Test
	public void usuarioFreeBuscaAsientosYRecibeTodosLosAsientosMenosLasSuperOfertas(){
		/*Un Usuario que no paga por el servicio (Free) realiza una busqueda. Como consecuencia debe recibir
		todos los Asientos menos aquellos que son SuperOfertas*/
		Assert.assertEquals(3, usuarioFree.buscarAsiento("BSAS", "LA", "20121010", "20121011").size());
		}
	
	@Test
	public void usuarioVIPBuscaAsientosYRecibeTodosLosAsientos(){
		/*Un Usuario VIP realiza una busqueda. Como consecuencia debe recibir tanto las SuperOfertas como los 
		Asientos normales*/
		Assert.assertEquals(10, usuarioVIP.buscarAsiento("BSAS", "LA", "20121010", "20121011").size());
		}
	
	@Test
	//TODO fijarse si float es la mejor decision para manejar precios (vale la pena usar BigDecimal)
	public void seCalculaCorrectamenteElPrecioDeUnAsientoParaUnUsuarioVIP(){
		/*Se chequea si el calculo de los Adicionales para el precio de un Asiento se realiza correctamente para un Usuario VIP.
		 Al ser VIP solo deberia adicionarsele el impuesto de la Aerolinea.*/
		//TODO mejorar el test
		List<Asiento> listaConAdicionales = AerolineaManagerMOCK.getInstance().agregarAdicionalUsuario(aerolineaTest.agregarAdicionalAerolinea(listaConUnAsiento), usuarioVIP);
		float precio = listaConAdicionales.get(0).getPrecio();
		float precioCorrecto = 230;
		Assert.assertEquals(precioCorrecto , precio);
	}
	
	@Test
	public void seCalculaCorrectamenteElPrecioDeUnAsientoParaUnUsuarioNoVIP(){
		/*Se chequea si el calculo de los Adicionales para el precio de un Asiento se realiza correctamente para un Usuario No VIP.
		Al ser No VIP pero Pago solo deberia adicionarsele el impuesto de la Aerolinea.*/
		List<Asiento> listaConAdicionales = AerolineaManagerMOCK.getInstance().agregarAdicionalUsuario(aerolineaTest.agregarAdicionalAerolinea(listaConUnAsiento), usuarioNoVIP);
		float precio = listaConAdicionales.get(0).getPrecio();
		float precioCorrecto = 230;
		Assert.assertEquals(precioCorrecto , precio);
	}
	
	@Test
	public void seCalculaCorrectamenteElPrecioDeUnAsientoParaUnUsuarioFree(){
		/*Se chequea si el calculo de los Adicionales para el precio de un Asiento se realiza correctamente para un Usuario Free.
		Al ser Free deberia adicionarsele el impuesto de la Aerolinea y el de por no pagar el servicio*/
		List<Asiento> listaConAdicionales = AerolineaManagerMOCK.getInstance().agregarAdicionalUsuario(aerolineaTest.agregarAdicionalAerolinea(listaConUnAsiento), usuarioFree);
		float precio = listaConAdicionales.get(0).getPrecio();
		float precioCorrecto = 250;
		Assert.assertEquals(precioCorrecto , precio);
	}
	
	@Test
	public void usuarioVIPCompraAsientoQueExiste(){
		/*Se chequea si la compra se realiza correctamente. Esto es que no tire una exception.*/
		usuarioVIP.comprar(new Asiento("01202022220202-3", Float.parseFloat("159.90"), "P", "V", aerolineaTest));
	}
	
	@Test (expected=CodigoErroneoException.class)
	public void usuarioVIPIntentaComprarAsientoQueNoExisteYNoPuede(){
		/*Se chequea que la compra de un asiento cuyo codigo no existe tire la exception debida.*/
		//TODO chequear que el constructor Float(String) hace lo que ustedes esperan
		usuarioVIP.comprar(new Asiento("CodigoQueNoExiste", new Float("159.90"), "P", "V", aerolineaTest));
	}
	
	@Test
	public void usuarioSeTransformaEnVipAlSuperarElMontoMinimo(){
		/*Se chequea que un usuario pago con un montoTotal de Compras de 99999 al realizar la compra de un Asiento mas
		se transforme en VIP ya que supera el monto minimo de compras necesarios para serlo.*/
		Assert.assertFalse(usuario.esVip());
		usuario.comprar(new Asiento("01202022220123-3", Float.parseFloat("205.10"), "E", "P", aerolineaTest));
		Assert.assertTrue(usuario.esVip());
	}

}
